<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h2>一、组件设计</h2>
  <div>现在有一个场景，点击新增与编辑都弹框出来进行填写，功能上大同小异，可能只是标题内容或者是显示的主体内容稍微不同。这时候就没必要写两个组件，只需要根据传入的参数不同，组件显示不同内容即可</div>
  <h2>二、需求分析</h2>
  <div>实现一个Modal组件，首先确定需要完成的内容：</div>
  <ul>
    <li>遮罩层</li>
    <li>标题内容</li>
    <li>主体内容</li>
    <li>确定和取消按钮</li>
  </ul>
  <br>
  <div>特点是它们在当前vue实例之外独立存在，通常挂载于body之上</div>
  <h2>三、实现流程</h2>
  <div>因为 Modal 会被 app.use(Modal) 调用作为一个插件，所以都放在plugins目录下</div>
  <ul>
    <li>目录结构</li>
    <li>组件内容</li>
    <li>实现 API 形式</li>
    <li>事件处理</li>
    <li>其他完善</li>
  </ul>
  <Teleport to="body" :disabled="!isTeleport">
    <div v-if="modelValue" class="modal">
        <div
             class="mask"
             :style="style"
             @click="maskClose && !loading && handleCancel()"
             ></div>
        <div class="modal__main">
            <div class="modal__title line line--b">
                <span>{{ title || t("r.title") }}</span>
                <span
                      v-if="close"
                      :title="t('r.close')"
                      class="close"
                      @click="!loading && handleCancel()"
                      >✕</span
                    >
            </div>
            <div class="modal__content">
                <Content v-if="typeof content === 'function'" :render="content" />
                <slot v-else>
                    {{ content }}
                </slot>
            </div>
            <div class="modal__btns line line--t">
                <button :disabled="loading" @click="handleConfirm">
                    <span class="loading" v-if="loading"> ❍ </span>{{ t("r.confirm") }}
                </button>
                <button @click="!loading && handleCancel()">
                    {{ t("r.cancel") }}
                </button>
            </div>
        </div>
    </div>
  </Teleport>

  <div>最外层上通过Vue3 Teleport 内置组件进行包裹，其相当于传送门，将里面的内容传送至body之上</div>
  <br>
  <div>最常见的则是通过调用字符串和默认插槽的形式</div>
    <!-- // 默认插槽
    <Modal v-model="show"
          title="演示 slot">
        <div>hello world~</div>
    </Modal>

    // 字符串
    <Modal v-model="show"
          title="演示 content"
          content="hello world~" /> -->


  <h4>实现 API 形式</h4>
  <div></div>
</body>
</html>